﻿using System.Reflection;
using System;

namespace TyMES.TemporaryClass
{
    public static class NormalMap
    {
        public static class PropertyCopier
        {
            public static void CopyProperties<T, R>(T source, R destination)
            {
                // 获取源对象和目标对象的类型
                Type sourceType = typeof(T);
                Type destinationType = typeof(R);

                // 获取源对象的所有属性
                PropertyInfo[] sourceProperties = sourceType.GetProperties();
                MethodInfo[] methodInfos = sourceType.GetMethods();
                // 遍历源对象的所有属性
                foreach (PropertyInfo sourceProperty in sourceProperties)
                {
                    // 获取目标类型的属性，属性名不区分大小写
                    PropertyInfo destinationProperty = destinationType.GetProperty(
                        sourceProperty.Name.ToUpper(),
                        BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);

                    // 如果目标属性存在
                    if (destinationProperty != null)
                    {
                        // 获取源属性的值
                        var value = sourceProperty.GetValue(source);

                        // 检查是否可以将源属性的值赋值给目标属性
                        if (destinationProperty.PropertyType.IsAssignableFrom(value.GetType()))
                        {
                            // 赋值给目标属性
                            destinationProperty.SetValue(destination, value);
                        }
                        else
                        {
                            throw new InvalidOperationException($"Property types are not compatible: {sourceProperty.Name} ({value.GetType()}) -> {destinationProperty.Name} ({destinationProperty.PropertyType}).");
                        }
                    }
                }
            }
        }
    }
}
